home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 2
/
Gold Medal Software Volume 2 (Gold Medal) (1994).iso
/
prog
/
asm_n_z.arj
/
PMODE.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-03-01
|
11KB
|
308 lines
NAME PMODE
PAGE 58,132
TITLE ' P M O D E --- SET LPT1: print options'
COMMENT /*
UTILITY TO SET PRINTER (LPT1: PRN) MODES ON IBM PERSONAL COMPUTER
PMODE is a DOS command (P.COM) which will set frequently used printer
options on the EPSON MX-80 or MX-100 printer. Only those options that
I frequently desire are set in order to keep the size of the command
within 256 bytes, which allows it to fit within one cluster on my RAM
drive. For the same reason, only one single character keyword option
may be specified with each execution. You can however issue the
command multiple times to achieve complimentary results, if they are
allowed by the printer.
Only the default printer may be set with this version. Other printers
may be selected by changing the value in the DH reg just prior to the
INT 17 in the PRTIO subroutine.
Other options can be easily added if you keep the keyword to a single
unique letter of a thru z.
Due to size no ERROR RECOVERY is performed. If the printer is turned
off or not ready nothing will happen. The bell is rung with each
successful execution, (except top of form) to let you know the IO was
performed.
I renamed the command to P.COM for easy of execution but you can call
it whatever you like.
*/
PAGE
COMMENT /*
FORMAT:
P option
OPTION:
T - Eject to next top of form
B - Ring the bell. Helpful to detect if the printer is ready.
C - Turn on COMPRESSED print (not valid with EMPHASIZED).
D - Turn on DOUBLE STRIKE mode.
E - Turn on EMPHASIZED mode (not valid with COMPRESSED mode).
N - Turn off automatic skip over perforation.
S - Set automatic skip over perforation to 6 lines.
R - RESET printer to power up specifications.
6 - Set printer spacing to 6 lines per inch.
8 - Set printer spacing to 8 lines per inch.
EXAMPLE:
p n - Turn off automatic skip over perforation.
p d - Turn on double strike.
(C)Copyright September 1983:
Timothy M. Hanes (713) 350-1438
ASYST Inc. (713) 776-9091
7502 Corporate Dr. Suite 237
Houston, Tx. 77036
*/
PAGE
;**********************
;* EQUATES *
;**********************
INPUT EQU 080H ;address of command tail
;buffer (set up by DOS)
BELL EQU 07H ;EPSON buzzer
BLANK EQU 20H ;ASCII blank code
COMP EQU 0FH ;EPSON compressed
CR EQU 0DH ;ASCII carriage return
DBLSTK EQU 47H ;EPSON double strike
EMPHSIZ EQU 45H ;EPSON emphasize
ESC EQU 1BH ;ASCII escape code
LF EQU 0AH ;ASCII line feed
LPI_6 EQU 32H ;EPSON 6 lines per inch
LPI_8 EQU 30H ;EPSON 8 lines per inch
NSOP EQU 4FH ;EPSON no skip over perf
RESET EQU 40H ;EPSON reset to power up state
SOP EQU 4EH ;EPSON skip over perf
TOF EQU 0CH ;EPSON advance to top of form
MASK_DF EQU 11011111B ;mask to AND lower case to upper case
PAGE
CSEG SEGMENT BYTE
ASSUME CS:CSEG,DS:CSEG
ORG 100H
PMODE: ;
MOV DI,OFFSET INPUT ;initialize DI to the
;address of the input buffer
MOV AL,[DI] ;check if any command tail
OR AL,AL ;and if not
JZ NODATA ;go set no input msg
MOV AL,BLANK ;load ASCII blank for scan
INC DI ;increment address in DI
;past the input count byte
MOV CX,80 ;scan max of 80 chars.
CLD ;clear direction flag
REPZ SCASB ;look for first non-blank
;character in input buffer
JZ NODATA ;if none found set no input msg
XOR AX,AX ;zero AX
XOR DX,DX ;zero DX
;load the non-blank char.,
MOV DL,-1[DI] ;use offset 0f -1 since DI
;will be pointing past it
CMP DL,CR ;if first non-blank char was CR
JE NODATA ;set no input msg
CMP DL,'a' ;compare for lower case a
JB SELECT ;go select if < a
CMP DL,'z' ;compare for lower case z
JA SELECT ;go select if > z
AND DL,MASK_DF ;change lower case to upper case
PAGE
SELECT: ;select the input character
CMP DL,'T' ;was it upper case "T"
JNE NOT_T ;no, go check for next character
SETTOF: MOV AL,TOF ;insert printer code
JMP SHORT SENDCODE ;go do printer io
NOT_T: ;check input character
CMP DL,'C' ;was it upper case "C"
JNE NOT_C ;no, go check for next character
SETCOMP: MOV AL,COMP ;insert printer code
JMP SHORT SENDCODE ;go do printer io
NOT_C: ;check input character
CMP DL,'D' ;was it upper case "D"
JNE NOT_D ;no, go check for next character
SETDBL: MOV AL,DBLSTK ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_D: ;check input character
CMP DL,'E' ;was it upper case "E"
JNE NOT_E ;no, go check for next character
SETEMPH: MOV AL,EMPHSIZ ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_E: ;check input character
CMP DL,'N' ;was it upper case "N"
JNE NOT_N ;no, go check for next character
SETNSOP: MOV AL,NSOP ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_N: ;check input character
CMP DL,'S' ;was it upper case "S"
JNE NOT_S ;no, go check for next character
SETSOP: MOV AL,SOP ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_S: ;check input character
CMP DL,'R' ;was it upper case "R"
JNE NOT_R ;no, go check for next character
SETRSET: MOV AL,RESET ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_R: ;check input character
CMP DL,'6' ;was it "6"
JNE NOT_6 ;no, go check for next character
SETLPI6: MOV AL,LPI_6 ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_6: ;check input character
CMP DL,'8' ;was it "8"
JNE NOT_8 ;no, go check for next character
SETLPI8: MOV AL,LPI_8 ;insert printer code
JMP SHORT ESC1ST ;go do printer io
NOT_8: ;check input character
CMP DL,'B' ;was it upper case "B"
JE RINGBELL ;yes go ring the the bell
; all other codes come thru here and are invalid
NODATA: ;no input data
MOV DX,OFFSET MSG1 ;set msg and
;print the message whose
;address is in reg DX
PRTMSG: MOV AH,9 ;function 9 = print string
INT 21H ;call DOS to print
JMP SHORT EXIT ;and exit back to DOS
ESC1ST: ;send escape code first
PUSH AX ;save AX
MOV AL,ESC ;move in ASCII 27 escape code
CALL PRTIO ;perform DOS print function
POP AX ;recover AX, contains prt code
SENDCODE: ;printer output routine
CALL PRTIO ;perform DOS print function
CMP DL,'S' ;if option "S"
JNE RINGBELL ;no, ring the bell
MOV AL,6 ;set SOP to 6 lines
CALL PRTIO ;perform DOS print function
RINGBELL: ;notify user of seccessful IO
CMP DL,'T' ;if option "T"
JE CR_ ;dont ring the bell
MOV AL,BELL ;move in ASCII 7 bell code
CALL PRTIO ;perform DOS print function
CR_: ;send carriage return
CMP DL,'R' ;if option "R"
JE EXIT ;dont send CR
MOV AL,CR ;send CR
CALL PRTIO ;perform DOS print function
EXIT: ;
INT 20H ;return to DOS
PAGE
;**********************
;* CLOSED ROUTINES *
;**********************
;**********************************************************************
PRTIO: ;INT 17 printer I/O routine
PUSH DX ;save DX
XOR DX,DX ;zero DX
PUSH AX ;save AX
MOV AH,00H ;zero AH, AL contains printer code
INT 17H ;DOS print function
POP AX ;recover AX
POP DX ;recover DX
RET ;return to caller
;**********************************************************************
PAGE
;**********************
;* CONSTANTS *
;**********************
MSG1 DB CR,LF
DB 'Invalid or no input - '
DB 'options= T B C D E N S R 6 or 8'
DB CR,LF,'$'
CSEG ENDS
END PMODE